/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.geradormalha;

import br.com.cpqd.ssar.geradormalha.gui.JanelaMalhaGerada;
import br.com.cpqd.ssar.mediador.RequisicaoServicos;
import br.com.cpqd.ssar.utilitarias.Geometria;
import br.com.cpqd.ssar.utilitarias.Vertice;
import javax.swing.JFileChooser;
import javax.swing.JFrame;

/**
 * Classe que Controla os Geradores de Malha
 * @author Rafael Buck
 * @version 1.4
 */
public class ControladorGeradorMalha implements RequisicoesGeradorMalha {

    /**
     * Interface da Requisição de Serviços
     */
    private RequisicaoServicos requisicaoServicos;
    /**
     * Janela que exibe a Malha Gerada
     */
    private JanelaMalhaGerada janelaMalhaGerada;
    /**
     * Classe que Gera a Malha
     */
    private GeradorMalhaFDTD geradorMalha;
    /**
     * Classe que Salva em Disco as Malhas Feitas
     */
    private ExportadorMalhaFDTD exportadorMalha;
    /**
     * Classe que Importa uma Malha Salva em Disco
     */
    private ImportadorMalhaFDTD importadorMalha;
    /**
     * Dimensões
     */
    private int[] n;

    /**
     * Método Construtor
     * @param requisicaoServicos RequisicaoServicos
     */
    public ControladorGeradorMalha(RequisicaoServicos requisicaoServicos) {
        this.requisicaoServicos = requisicaoServicos;
        exportadorMalha = new ExportadorMalhaFDTD();
        // Seta as dimensões iniciais
        n = new int[3];
        n[0] = 50;
        n[1] = 50;
        n[2] = 50;
    }
    
    
    /**
     * Gera a Malha para o Método FDTD
     * @param lista Geometria[]
     * @param max Vertice
     * @param min Vertice
     * @return boolean indicando o sucesso da operação
     */
    public boolean gerarMalhaFDTD(Geometria[] lista, Vertice max, Vertice min) {
        try {
            geradorMalha = new GeradorMalhaFDTD(this.n[0], this.n[1], this.n[2], min.getCoordenada(0), max.getCoordenada(0), min.getCoordenada(1), max.getCoordenada(1), min.getCoordenada(2), max.getCoordenada(2));
            geradorMalha.gerarMalhaFDTD3D(lista);
            return exportadorMalha.exportMeshFDTD(requisicaoServicos, geradorMalha);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

    /**
     * Solicita criação de uma malha tridimensional para o método numérico FDTD dada uma lista 
     * de geometrias
     * @param lista Geometria[]
     * @param max Vertice
     * @param min Vertice
     * @param nxiPML int número de cubos que irão compor a PML do eixo x (inicial)
     * @param nxfPML int número de cubos que irão compor a PML do eixo x (final)
     * @param nyiPML int número de cubos que irão compor a PML do eixo y (inicial)
     * @param nyfPML int número de cubos que irão compor a PML do eixo y (final)
     * @param nziPML int número de cubos que irão compor a PML do eixo z (inicial)
     * @param nzfPML int número de cubos que irão compor a PML do eixo z (final)
     * @return status da operação
     */
    public boolean gerarMalhaFDTDcomPMLs(Geometria[] lista, Vertice max, Vertice min, int nxiPML, int nxfPML, int nyiPML, int nyfPML, int nziPML, int nzfPML) {

        if (nxiPML >= 0 && nyiPML >= 0 && nziPML >= 0 && nxfPML >= 0 && nyfPML >= 0 && nzfPML >= 0) {
            try {
                geradorMalha = new GeradorMalhaFDTD(this.n[0], this.n[1], this.n[2], min.getCoordenada(0), max.getCoordenada(0), min.getCoordenada(1), max.getCoordenada(1), min.getCoordenada(2), max.getCoordenada(2), nxiPML, nxfPML, nyiPML, nyfPML, nziPML, nzfPML);
                geradorMalha.gerarMalhaFDTD3D(lista);
                return exportadorMalha.exportMeshFDTD(requisicaoServicos, geradorMalha);
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        } else {
            return false;
        }

    }

    /**
     * Importa uma Malha
     * @return Geometria representando a malha
     */
    public Geometria importarMalha() {

        importadorMalha = new ImportadorMalhaFDTD();

        // Procura um Caminho no Computador
        JFileChooser jFileChooser = new JFileChooser();
        // Habilita para Obter apenas Diretorios
        jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
//        // Seta Filtro
//        jFileChooser.setFileFilter(importadorMalha.obterFiltroMalha());
        // Seta Filtro
        jFileChooser.setFileFilter(importadorMalha.obterFiltroMalhaFormatoCompacto());
        // Muda o título da Janela do File Chooser
        jFileChooser.setDialogTitle("Localizar Arquivo");
        // Lê a Opção do Usuário
        int option = jFileChooser.showOpenDialog(new JFrame());
        // Teste de Seleção do Usuário
        if (option == JFileChooser.APPROVE_OPTION) {
            // Obtem o caminho
            String caminho = jFileChooser.getSelectedFile().toString();
//            // Importa a malha
//            importadorMalha.importarMalha(requisicaoServicos, caminho);
            // Importa a malha
            importadorMalha.importarMalhaFormatoCompacto(requisicaoServicos, caminho);
            // Visualiza a malha
            janelaMalhaGerada = new JanelaMalhaGerada(importadorMalha, requisicaoServicos);
            janelaMalhaGerada.setVisible(true);
            return null;
//            return importadorSTL.carregarGeometria(caminho);
        } else if (option == JFileChooser.CANCEL_OPTION) {
            return null;
        }
        return null;
    }

    /**
     * Exibe a Janela de Malha Gerada
     */
    public void exibirJanelaMalhaGerada() {
        janelaMalhaGerada = new JanelaMalhaGerada(geradorMalha, requisicaoServicos);
        janelaMalhaGerada.setVisible(true);
    }

    /**
     * Seta as Dimensões da Malha discretizada
     * @param nx int > 0
     * @param ny int > 0
     * @param nz int > 0
     */
    public void setDimensoes(int nx, int ny, int nz) {
        if (nx > 0 && ny > 0 && nz > 0) {
            n[0] = nx;
            n[1] = ny;
            n[2] = nz;
        }
    }
}
